'use strict'

class Orcamento {
    
    montarOrcamentos(hoteis, estadia){
        this.hoteis             = hoteis
        this.tipoCliente        = this.descobrirTipoCliente(estadia)
        this.dias               = this.descobrirDias(estadia)
        this.totalDias          = this.descobrirTotalDias()
        this.diasFinaisSemana   = this.descobrirTotalFinaisSemana(this.dias)
        this.diasSemana         = this.descobrirDiasSemana()
        return this.descobrirPrecosHoteis(this.tipoCliente)
    }

    descobrirDiasSemana() {
        return this.totalDias - this.diasFinaisSemana
    }

    descobrirTipoCliente(estadia){
        return estadia.trim().split(":")[0].toLowerCase()
    }

    descobrirEstadia(estadia){
        return estadia.trim().split(":")[1]
    }

    descobrirDias(estadia) {
        return this.descobrirEstadia(estadia).split(",")
    }

    descobrirTotalDias(){
        return this.dias.length
    }
    
    descobrirTotalFinaisSemana(dias){
        return dias.map( dia => {
            if (this.isFinalSemana(dia)) { return 1 }
            return 0
        }).reduce( (diaAnterior, diaAtual) => {
            return diaAnterior + diaAtual
        })
    }

    descobrirPrecosHoteis(tipoCliente){
       return this.hoteis.map( hotel => {
            return { 
                nome: hotel.getNome(), 
                classificacao: hotel.getClassificacao(), 
                orcamento: this.calcularOrcamentos(tipoCliente, hotel.getTarifa()) 
            }
        }) 
    }

    calcular(precoSemana, precoFinalSemana){
        return (this.diasSemana * precoSemana) + this.diasFinaisSemana * precoFinalSemana
    }

    calcularOrcamentos(tipoCliente, tarifa){
        const precoSemana = tarifa.getPrecoSemana()
        const precoFinalSemana = tarifa.getPrecoFinalSemana()
        return this.calcular(precoSemana, precoFinalSemana)
    }

    calcularPreco(precoSemana, precoFinalSemana){
        if (this.isClienteRegular(this.tipoCliente)) {
            return this.calcular(precoSemana.getPrecoRegular(), precoFinalSemana.getPrecoFidelidade())
        }
        return this.calcular(precoSemana.getPrecoFidelidade(), precoFinalSemana.getPrecoFidelidade())
    }

    isFinalSemana(dia) {
        const re = /(sat)|(sun)/
        return re.test(dia)
    }

    isClienteRegular(tipoCliente){
        return tipoCliente == 'regular'
    }
}

module.exports = Orcamento